#ifndef __KEY_H_
#define __KEY_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "driver/gpio.h"


#include "../my_driver/gpio_drive.h"
#include "../Product_Config.h"
#include "../LOG.h"
#include "../arch_os.h"
#define     LEV_KEY_OPT_PRESSED          0  //按键按下为低电平
#define     LEV_KEY_OPT_UNPRESS        1   //按键抬起为高电平


//驱动信号采集任务的周期,单位ms
#define TASK_SENSOR_DECT_PERIOD 5



#define LEV_KEY_PRESSED LEV_KEY_OPT_PRESSED
#define LEV_KEY_UNPRESS LEV_KEY_OPT_UNPRESS

/*扫描时间周期*/
#define KEY_SCAN_PERIOD TASK_SENSOR_DECT_PERIOD

//按键消抖防干扰时间
#define KEY_DISTURTHRESHOLD     50

//按键短按判断阈值
#define KEY_SHORTHRESHOLD  	1000
#define KEY_RECOVERYHOLD    2000
#define KEY_5SHOLD    5000
#define KEY_LONGTHRESHOLD1    2000
#define KEY_LONGTHRESHOLD2    65535


#define     GPIO_KEY1_OPT               33 //5  //开关


#define     GPIO_KEY2_OPT               17	//模式
#define     GPIO_KEY3_OPT               19	//减
#define     GPIO_KEY4_OPT              	18 	//加
#define     GPIO_KEY5_OPT               16	//麦克风

#define NUM_KEY 1

//按键状态枚举类型
typedef enum
{	
	KEY_STANONE, //0 按键没有按下
	KEY_STAPRESS,//1 按键处于按住状态
	KEY_STASHORT, //2 按键短按
	KEY_DOUBLE_SHORT, //3 双击短按
	KEY_STALONG_1S, //4 按键长按2S
	KEY_STALONG_5S, //5 按键长按5s
	KEY_RECOVERY//4恢复选择状态按键
}ENUM_KEYSTA;


typedef enum
{
    DRV_ACT_NONE,//0 按键没有动作
    DRV_ACT_KEY_START, //1 
    DRV_ACT_KEY_SHORT,//2 短按
	DRV_ACT_KEY_DOUBLE, //3 双击
    DRV_ACT_KEY_1S,//4 长按1s
	DRV_ACT_KEY_5S,//5 长按5s
	DRV_ACT_KEY_RECOVERY, //6按键复位
    DRV_ACT_KEY_END,
    NUM_DRV_ACT,
}EM_DRV_ACT;

typedef struct
{
	ENUM_KEYSTA  sta;  //按键状态枚举值
	u16  keyCnt;
	u8  flgPressed;  //是否被按下
	u8  flgReset;
	u8  finishflg;
	u8 	finishflg1s;
	u8  finishflg5s;
	u8 	finishflgencode;
}ST_KEYDAT;

void key_init();
void key_update_sta();
void clear_key_update(); //用于按压旋转时一直无法触发

ENUM_KEYSTA key_get_state(u8 keyx);
void key_set_state(u8 keyx, ENUM_KEYSTA stax);
#endif